#ifndef HASH_H
#define HASH_H
/*! @file  Header utilizado para a melhor organização do código destinado as operações com a tabela hash */
#include <stdlib.h>
/*! TAMANHOVETOR define o tamanho do vetor que vai de 0 a 2010 */
#define TAMANHOVETOR 2617
/*! CHECKMOD utilizado para marcar espaços vagos na tabela, garante que não seram inseridos valores maiores que ele , pois o hash de inserção na tabela é mod CHECKMOD*/
#define CHECKMOD 2609
/*! hash_t  estrutura criada para facilitar a comparação entre as diversas formas de hash, abriga o vetor com os dados e um campos com as quantidade de posições utilizadas */
typedef struct {
	/*! vetor que contem os valores inseridos na tabela */
	int    data[TAMANHOVETOR];
	/*! estrutura que contem o número de posições utilizadas */
	size_t used;
	unsigned int acessosParaEscrita;
	unsigned int acessosParaLeitura;
	unsigned int totalTentativasPalavrasEscritas;
	unsigned int totalTentativasPalavrasLidas;
} hash_t;

/*! @brief função para encapsular a criação da tabela de hash, feitar para fazer a interface entre o código não interno a tabela hash e o interno.
 * @return um ponteiro para a área de memória alocada para a estrutura da tabela hash
 */
hash_t *hash_create();

/*! @brief libera os recursos de memória alocados para a tabela
 * @param hash tabela que será destruida
 */
void hash_destroy(hash_t* hash);

/*! @brief esvazia todo o conteúdo da tabela, deixando-a pronta para uso novamente.
 * @param hash tabela que será esvaziada.
 */
void hash_reset(hash_t *hash);

/*! @brief imprime na tela as estatísticas obtidas com as funções de hash atuais em uso.
 * @param table  tabela que reflete as estatísticas.
 */
void hash_stats(hash_t *hash);

/*! @brief método que faz a inserção de uma palavra na tabela hash
 *  @param table referência para a tabela que recebera a palavra
 *  @param palavra	palavra que será inserida na tabela hash
 */
void hash_insert(hash_t *table, char * palavra);

/*! @brief procura ocorrências da palavra na tabela hash
 *  @param table tabela aonde ocorrerá a busca
 *  @param palavra palavra que será buscada na tabela
 *  @return inteiro que terá 1 como valor se for encontrada a ocorrência e 0 se não for encontrada.
 */
int hash_find(hash_t *table, char * palavra);

/*! @brief função que retornará , dado uma palavra , um número que indica aonde ocorrerá a primeira tentativa de inserir uma palavra.
 *  @param palavra que será utilizada para calcular o hash
 *  @result valor do hash propriamente dito
 */
unsigned long hash1(unsigned char * palavra);

/*! @brief função que retornará , dado uma palavra , um número de incremento que será utilizado se a inserção não puder ocorrer na posição da tentativa de inserção anterior.
 *  @param palavra que será utilizada para calcular o hash de incremento
 *  @result valor do hash de incremento propriamente dito
 */
int hash2(unsigned char * palavra);

/*! @brief função que retornará , dado uma palavra , um número que será inserido na tabela hash.
 *  @param palavra que será utilizada para calcular o hash
 *  @result valor do hash propriamente dito
 */
unsigned long hash3(unsigned char * palavra);

#endif /* HASH_H */
